package com.gz.web.datavalid;


import com.gz.web.datavalid.entity.Monster;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.validation.Valid;
import java.util.Map;

@Controller
@Scope(value = "prototype")
public class MonsterHandler {

    @RequestMapping(value = "/addMonsterUI")
    public String addMonsterUI(Map<String, Object> map) {
        /*
            1. 这里的表单，我们使用 springMVC 的标签来完成
            2. SpringMVC 表单标签在显示之前必须在 request 中有一个 bean, 该bean
             的属性和表单标签的字段要对应!
             request中的key为:form标签的 modelAttribute 属性值，比如这里的monsters
            3. SpringMVC 的 form:form 标签的 action 属性值中的 / ,
            不代表 WEB 应用的根目录
            4.这里需要给request增加一个monster，
            因为jsp页面的modelAttribute="monster"需要,
            这时是springMVC的内部的检测机制,即使是一个空的也需要，否则报错.
         */
        map.put("monster", new Monster());
        return "datavalid/monster_addUI";
    }

    @RequestMapping("/save")
    public String save(@Valid Monster monster, Errors errors, Map<String, Object> map) {

        System.out.println("monster= "+monster);
       if (errors.hasErrors()) {
           return "datavalid/monster_addUI";
       }
        return "datavalid/success";
    }

    //取消绑定 monster的name表单提交的值给monster.name属性
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        //1.当表单表单提交字段name时，就不再把接收到的name值，填充到model数据monster的name属性
        //2.机制:springmvc在底层通过反射调用目标方法时，接收到的http请求的参数和值，使用反射+注解
        //取消对指定属性的填充(如填充monster)

        //3.如果取消了某个属性的绑定，那么验证就没用意义了，应当把验证的注解去掉
        //如 @NotEmpty-> 去掉
        //private String name;

//        webDataBinder.setDisallowedFields("name");
    }
}
